﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Library.BLL;
using System.Threading;

namespace View
{
    public partial class frmCadastroUsuario : Form
    {

        String acao = String.Empty;
        private const string ALTERACAO = "A";
        private const string CADASTRO = "C";

        #region declaracao dos DataTables
        DataTable dtDadosUsuario;
        DataTable dtUFs;
        DataTable dtCidades;
        DataTable dtBancos;

        #endregion

        #region declaracao dos controllers

        PessoaController ctrlPessoa = new PessoaController();
        CidadeController ctrlCidade = new CidadeController();
        UFController ctrlUF = new UFController();
        BancoController ctrlBanco = new BancoController();

        #endregion

        public frmCadastroUsuario()
        {
            InitializeComponent();

            this.Text = "Cadastro de Usuário";
            this.acao = CADASTRO;

            //Não exibe código e data de cadastro quando é um novo cadastro
            gbCadastro.Visible = false;
            populaDadosNovoUsuario();

        }

        public frmCadastroUsuario(int codigoUsuario)
        {
            InitializeComponent();

            this.Text = "Alteração de Usuário";
            this.acao = ALTERACAO;

            populaDadosUsuario(codigoUsuario);
        }

        /// <summary>
        /// Popula Dados para cadastro de novo usuário
        /// </summary>
        private void populaDadosNovoUsuario()
        {
            dtDadosUsuario = ctrlPessoa.createDataTable();
            bindingDados();
            dtDadosUsuario.Rows.Add(dtDadosUsuario.NewRow());
            dtDadosUsuario.Rows[0].BeginEdit();
        }

        /// <summary>
        /// Metodo que popula dados para alteração de usuário
        /// </summary>
        /// <param name="codigoUsuario"></param>
        private void populaDadosUsuario(int codigoUsuario)
        {
            dtDadosUsuario = ctrlPessoa.getDadosUsuario(codigoUsuario);
            bindingDados();
            dtDadosUsuario.Rows[0].BeginEdit();
        }

        private void bindingDados()
        {
            //Carrega UF e Cidade
            dtUFs = ctrlUF.getAllRecords();

            cbUF.DataSource = dtUFs;
            cbUF.DisplayMember = "SIGLA_ESTADO";
            cbUF.ValueMember = "SIGLA_ESTADO";

            dtBancos = ctrlBanco.getAllRecords();
            cbBanco.DataSource = dtBancos;
            cbBanco.DisplayMember = "NOME_BANCO";
            cbBanco.ValueMember = "COD_BANCO";

            if (this.acao == ALTERACAO)
            {
                String ufCidade = ctrlCidade.getEstadoPorCidade(dtDadosUsuario.Rows[0]["SEDE"].ToString());
                cbUF.SelectedIndex = dtUFs.Rows.IndexOf(dtUFs.Select("SIGLA_ESTADO ='" + ufCidade + "'")[0]);
                cbSede.SelectedIndex = dtCidades.Rows.IndexOf(dtCidades.Select("NOME_CIDADE ='" + dtDadosUsuario.Rows[0]["SEDE"].ToString() + "'")[0]);
                cbBanco.SelectedIndex = dtBancos.Rows.IndexOf(dtBancos.Select("COD_BANCO = " + dtDadosUsuario.Rows[0]["COD_BANCO"].ToString())[0]);
            }

            //binding de variáveis
            txtCodigoUsuario.DataBindings.Add("Text", dtDadosUsuario, "COD_PESSOA");
            txtNome.DataBindings.Add("Text", dtDadosUsuario, "NOME_PESSOA");
            txtCargo.DataBindings.Add("Text", dtDadosUsuario, "CARGO_FUNCAO");
            txtRg.DataBindings.Add("Text", dtDadosUsuario, "RG");
            txtCategoria.DataBindings.Add("Text", dtDadosUsuario, "CATEGORIA");
            txtVencimento.DataBindings.Add("Text", dtDadosUsuario, "PAGTO_MENSAL");
            msktxtAgencia.DataBindings.Add("Text", dtDadosUsuario, "AGENCIA");
            msktxtContaCorrente.DataBindings.Add("Text", dtDadosUsuario, "CONTA_CORRENTE");
            txtUO.DataBindings.Add("Text", dtDadosUsuario, "UO");
            txtUD.DataBindings.Add("Text", dtDadosUsuario, "UGE");
            dtpDataCadastro.DataBindings.Add("Text", dtDadosUsuario, "DT_CADASTRO");
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            DialogResult cancelar = MessageBox.Show("Deseja cancelar a operação?", this.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (cancelar == DialogResult.Yes)
            {
                dtDadosUsuario.RejectChanges();
                Close();
            }
        }

        /// <summary>
        /// Insere os dados na tabela
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOK_Click(object sender, EventArgs e)
        {
            if (validaCampos(sender))
            {
                //Carrega campos sem binding
                if (acao.Equals(CADASTRO))
                {
                    dtDadosUsuario.Rows[0]["COD_PESSOA"] = ctrlPessoa.getNextCodigoUsuario();
                    dtDadosUsuario.Rows[0]["DT_CADASTRO"] = DateTime.Now.ToShortDateString();
                }

                dtDadosUsuario.Rows[0]["SEDE"] = cbSede.Text;
                dtDadosUsuario.Rows[0]["COD_BANCO"] = Convert.ToInt32(cbBanco.SelectedValue);
                if (rbAuxiliar.Checked)
                    dtDadosUsuario.Rows[0]["NIVEL"] = "A";
                else
                    dtDadosUsuario.Rows[0]["NIVEL"] = "U";

                dtDadosUsuario.Rows[0].EndEdit();
                ctrlPessoa.UpdateDataTable(dtDadosUsuario.GetChanges());
                dtDadosUsuario.AcceptChanges();
            }
            else
            {
                this.DialogResult = DialogResult.None;
                return;
            }
            this.DialogResult = DialogResult.OK;
        }

        /// <summary>
        /// Rotina para validar se todos os campos obrigatórios 
        /// estão preenchidos
        /// </summary>
        /// <returns></returns>
        private bool validaCampos(object sender)
        {
            if (String.IsNullOrEmpty(txtNome.Text))
            {
                MessageBox.Show("Digite o nome do usuário.", "Campo obrigatório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtNome.BackColor = Color.LightCoral;
                txtNome.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(txtCargo.Text))
            {
                MessageBox.Show("Digite o cargo/função do usuário.", "Campo obrigatório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtCargo.BackColor = Color.LightCoral;
                txtCargo.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(txtRg.Text))
            {
                MessageBox.Show("Digite o RG do usuário.", "Campo obrigatório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtRg.BackColor = Color.LightCoral;
                txtRg.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(txtCategoria.Text))
            {
                MessageBox.Show("Digite a categoria do usuário.", "Campo obrigatório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtCategoria.BackColor = Color.LightCoral;
                txtCategoria.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(txtVencimento.Text))
            {
                MessageBox.Show("Digite o vencimento do usuário.", "Campo obrigatório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtVencimento.BackColor = Color.LightCoral;
                txtVencimento.Focus();
                return false;
            }
            else if (cbBanco.SelectedValue == null || String.IsNullOrEmpty(cbBanco.SelectedValue.ToString()))
            {
                MessageBox.Show("Selecione o Banco do usuário.", "Campo obrigatório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                cbBanco.BackColor = Color.LightCoral;
                cbBanco.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(msktxtAgencia.Text))
            {
                MessageBox.Show("Digite a agência do usuário.", "Campo obrigatório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                msktxtAgencia.BackColor = Color.LightCoral;
                msktxtAgencia.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(msktxtContaCorrente.Text))
            {
                MessageBox.Show("Digite a conta corrente do usuário.", "Campo obrigatório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                msktxtContaCorrente.BackColor = Color.LightCoral;
                msktxtContaCorrente.Focus();
                return false;
            }
            else if (cbUF.SelectedValue == null || String.IsNullOrEmpty(cbUF.SelectedValue.ToString()))
            {
                MessageBox.Show("Selecione o estado da Sede.", "Campo obrigatório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                cbUF.BackColor = Color.LightCoral;
                cbUF.Focus();
                return false;
            }
            else if (cbSede.SelectedValue == null || String.IsNullOrEmpty(cbSede.SelectedValue.ToString()))
            {
                MessageBox.Show("Selecione a Sede do usuário.", "Campo obrigatório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                cbSede.BackColor = Color.LightCoral;
                cbSede.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(txtUO.Text))
            {
                MessageBox.Show("Digite a Unidade Orçamentária  do usuário.", "Campo obrigatório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtUO.BackColor = Color.LightCoral;
                txtUO.Focus();
                return false;
            }
            else if (String.IsNullOrEmpty(txtUD.Text))
            {
                MessageBox.Show("Digite a Unidade Gestora Executora do usuário.", "Campo obrigatório", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                txtUD.BackColor = Color.LightCoral;
                txtUD.Focus();
                return false;
            }
            return true;
        }

        private void cbUF_SelectedIndexChanged(object sender, EventArgs e)
        {
            dtCidades = ctrlCidade.getCidadesPorEstado(dtUFs.Rows[cbUF.SelectedIndex]["SIGLA_ESTADO"].ToString());

            cbSede.DataSource = dtCidades;
            cbSede.DisplayMember = "NOME_CIDADE";
            cbSede.ValueMember = "COD_CIDADE";
        }

        private void txtContaCorrente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && !e.KeyChar.ToString().Equals("-"))
                e.Handled = true;
        }

        private void txtAgencia_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && !e.KeyChar.ToString().Equals("-"))
                e.Handled = true;
        }

        private void txtVencimento_Click(object sender, EventArgs e)
        {
            //Adicionado 4 ao length devido a mask utilizada no componente
            txtVencimento.Select(0, txtVencimento.Value.ToString().Length + 4);
        }

        private void retornaValidacao(object sender, EventArgs e)
        {
            ((Control)sender).BackColor = Color.White;
        }
    }
}
